package com.tang.juc.VolatileTest;

/**
 * @author tlm
 * @version 1.0
 * @date 2020/4/17 8:55
 * 验证Volatile不保证原子性
 */
public class VolatileDemo2 {
    public static void main(String[] args) {
        MyData2 myData2 = new MyData2();

        for (int i = 1; i <= 20; i++) {
            new Thread(() -> {
                for (int j = 1; j <= 1000; j++) {
                    myData2.addAdd();
                }
            }, String.valueOf(i)).start();
        }
        //等待上面20个线程执行完毕后，用main线程查看计算结果
        while (Thread.activeCount() > 2) {
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName()+"\t number的值为："+myData2.number);
        /*
        如果volatile保证原子性，那么输出结果应该为20000,但是输出结果不为20000，因此volatile不保证原子性
         */
    }
}

//资源类
class MyData2 {
    volatile int number = 0;

    public void addAdd() {
        number++;
    }


}
